package juc2.volatiledome;

/**
 * 1.volatile关键字的作用 利用可见性和禁止指令重排序双重检验
 */
public class Singleton {
    // volatile禁止instance初始化与赋值操作重排序
    private static volatile Singleton instance;
    private Singleton() {} // 私有构造

    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查（无锁，提高效率）
            synchronized (Singleton.class) { // 同步锁
                if (instance == null) { // 第二次检查（避免多线程重复创建）
                    // 若instance无volatile修饰，可能发生指令重排序：
                    // 1. 分配内存 2. 赋值给instance 3. 初始化对象
                    // 重排序后可能先执行2再执行3，导致其他线程获取到未初始化的instance
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
